package com.tjetc;


import org.dom4j.DocumentException;


import java.lang.reflect.Proxy;
import java.sql.SQLException;

/**
 * @author gaoyongxiang
 * @version v1.0
 * @date 2025/8/20
 */
public class MySqlSession {
    // 配置类对象
    private MyConfiguration configuration = new MyConfiguration();

    // 执行器对象
    private Executor executor = new MyExecutor();


    // 真正发送给数据库要执行的命令
    public <T> T selectOne(String sql, Object param) throws SQLException, DocumentException, ClassNotFoundException {
        return executor.query(sql, param);
    }


    /**
     * 返回mapper的接口动态代理对象
     * <p>
     * 当执行接口方法时（通过代理对象调用），根据动态代理机制绘制执行到invoke方法
     *
     * @param clazz 接口类型
     * @param <T>   接口类型
     * @return 接口代理对象
     */
    public <T> T getMapper(Class<T> clazz) {
        /*
            ClassLoader loader, 需要一个类加载器
            Class<?>[] interfaces, 我们对应的mapper接口
            InvocationHandler h  实现了InvocationHandler的实现类
         */
        return (T) Proxy.newProxyInstance(
                clazz.getClassLoader(),
                new Class[]{clazz},
                new MyMapperProxy(
                        this,
                        clazz,
                        configuration));
    }


}